// Snake类    表示蛇类
function Snake() {
    // 接收数据
    // 数据属性存储蛇的每一节身体  而每一节身体由两个值组成
    // x   y

    this.arr = [
        { x: 4, y: 4},
        { x: 4, y: 5},
        { x: 4, y: 6},
        { x: 4, y: 7},
        { x: 4, y: 8}
    ];
    // 方向属性
    this.direction = 39;   //  37 左箭头   38  上箭头    39 右箭头    40 下箭头
    // 定义锁
    this.lock  = true;
}


// 移动方法
Snake.prototype.move = function() {
    // 移动后把锁打开
    this.lock = true;

    // 根据原有的头部创建新的头部
    var newHead = {
        x: this.arr[this.arr.length - 1].x,
        y: this.arr[this.arr.length - 1].y
    }

    // 根据头部方向改变坐标值
    if (this.direction === 37) {
        // x不变  y每次 - 1
        newHead.y--;
    } else if (this.direction === 38) {
        // 此时y不变 x--
        newHead.x--;
    } else if (this.direction === 39) {
        // 此时x不变 y要++
        newHead.y++;
    } else if (this.direction === 40) {
        newHead.x++;
    }
    // 往数组中追加新的头部
    this.arr.push(newHead);

    // 删除数组中的第一项
    this.arr.shift();
}

// 定义change方法
Snake.prototype.change = function(direction) {
    // 在转向的时候做判断
    if (!this.lock) return;

    // 把锁关闭
    this.lock = false;


    // 判断用户传递的方向是否合法  例如：如果蛇在横向运动此时传递37和39都不合法 而此时传递38和40是合法的
    // 定义结果
    var result = Math.abs(direction - this.direction);
    // 判断传递放的方向是否合法
    if (result === 2 || result === 0) {
        // 终止运行
        return;
    }
    // 执行到这里说明传递是合法的
    this.direction = direction;
}


// 定义growUp方法
Snake.prototype.growUp = function() {
    // 获取蛇的尾部(数组的第一项)
    var tail = this.arr[0];
    // 追加到数组的第一项
    this.arr.unshift(tail);
}